package top.canyue.eca_manager.controller;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import top.canyue.eca_manager.bean.Result;
import top.canyue.eca_manager.bean.User;
import top.canyue.eca_manager.service.UserService;

import java.util.UUID;

/**
 * 用户相关接口
 *
 * @author canyue
 */
@RestController
@RequestMapping(value = "/api/user")
public class UserController {
    @Autowired
    UserService userService;

    /**
     * 根据用户ID查找用户信息
     * @param id 用户ID
     */
    @RequestMapping(value = "/findById", method = RequestMethod.GET)
    public Result findById(@RequestParam String id) {
        return userService.findById(id);
    }

    /**
     * 登录
     * @param idOrName 用户ID 或 用户名
     * @param passwd 密码
     * @return 用户基本信息, 不含密码
     */
    @RequestMapping(value = "/login", method = RequestMethod.POST)
    public Result login(@RequestParam String idOrName, @RequestParam String passwd) {
        Result result =  userService.login(idOrName, passwd);
        UUID uuid = UUID.randomUUID();
        String tokenStr = StringUtils.remove(uuid.toString(), '-');
        result.setToken(tokenStr);
        return result;
    }

    /**
     * 注册
     * @param name 用户名
     * @param passwd 密码
     * @param phone 手机号
     * @return 返回内容中包含用户UUID
     */
    @RequestMapping(value = "/logon", method = RequestMethod.POST)
    public Result logon(
            @RequestParam String name,
            @RequestParam String passwd,
            @RequestParam String phone
    ) {
        return userService.logon(name, passwd, phone);
    }

    /**
     * 修改用户信息
     * 已知漏洞：用户可能利用此接口在未登录时修改用户信息，后续本接口可能将新增密码参数
     * @param id 用户ID
     * @param name 用户名
     * @param phone 用户手机号
     */
    @RequestMapping(value = "/updateUserInfo", method = RequestMethod.POST)
    public Result updateUserInfo(
            @RequestParam String id,
            @RequestParam String name,
            @RequestParam String phone
    ) {
        User user = new User();
        user.setId(id);
        user.setName(name);
        user.setPhone(phone);
        return userService.updateUserInfo(user);
    }

    /**
     * 更新用户密码
     * @param id 用户ID
     * @param oldPasswd 旧密码
     * @param newPasswd 新密码
     */
    @RequestMapping(value = "/updateUserPasswd", method = RequestMethod.POST)
    public Result updateUserPasswd(
            @RequestParam String id,
            @RequestParam String oldPasswd,
            @RequestParam String newPasswd
    ) {
        return userService.updateUserPasswd(id, oldPasswd, newPasswd);
    }

    /**
     * 删除用户信息，本接口为软删除
     * @param id 用户ID
     */
    @RequestMapping(value = "/deleteUser", method = RequestMethod.POST)
    public Result deleteUser(@RequestParam String id) {
        return userService.deleteUser(id);
    }

    /**
     * 更新用户权限
     *
     * @param id    用户ID
     * @param admin 是否为管理员
     */
    @RequestMapping(value = "/updateUserAdmin", method = RequestMethod.POST)
    public Result updateUserAdmin(@RequestParam String id, @RequestParam boolean admin) {
        return userService.updateUserAdmin(id, admin);
    }

    /**
     * 查询所有已经注册的用户数 （已经删除的不算）
     * @return count 用户数
     */
    @RequestMapping(value = "/getUserCount", method = RequestMethod.GET)
    public Result getUserCount(){
        return userService.getUserCount();
    }

    /**
     * 查询这个月已经注册的用户数 （已经删除的不算）
     * @return count 用户数
     */
    @RequestMapping(value = "/getUserCountByMount", method = RequestMethod.GET)
    public Result getUserCountByMount(){
        return userService.getUserCountByMount();
    }

    /**
     * 返回与输入用户名匹配的所有用户信息
     *
     * @param name      用户名(模糊查找)
     * @param orders    排序，例如"name DESC" 默认 "createTime ASC"
     * @param offset    偏移量，应大于等于0
     * @param fetchSize 一页条目数，应大于等于1
     * @return 用户信息列表
     */
    @RequestMapping(value = "/findByName", method = RequestMethod.GET)
    public Result findByName(@RequestParam String name, @RequestParam String orders, @RequestParam Integer offset, @RequestParam Integer fetchSize) {
        return userService.findByName(name, orders, offset, fetchSize);
    }

    /**
     * 返回与输入用户名匹配的所有用户数量
     * @param name 用户名(模糊查找)
     * @return 用户数量
     */
    @RequestMapping(value = "/getUserCountByName", method = RequestMethod.GET)
    public Result getUserCountByName(@RequestParam String name) {
        return userService.getUserCountByName(name);
    }

    /**
     * 一个轻量化的接口，只返回未被删除的用户ID和名字
     *
     * @return 用户ID，名字
     */
    @RequestMapping(value = "/getAllUserName", method = RequestMethod.GET)
    public Result getAllUserName() {
        return userService.getAllUserName();
    }
}
